package talayaco.dao;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface AnimalDAO {

	/**
	 * Persiste un animal en la base de datos
	 * 
	 * @param datos
	 *            Mapa con los datos necesarios para la persistencia
	 * 
	 * @throws Exception
	 */
	void insertAnimal(Map<String, Object> datos) throws Exception;

	/**
	 * Obtiene datos del animal en base a la caravana
	 * 
	 * @param caravana
	 *            Caravana del animal
	 * @return Datos del animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalByCaravana(String caravana) throws Exception;

	/**
	 * Metodo que verifica si un animal ya existe en la base de datos.
	 * 
	 * @param caravana
	 *            Caravana del animal
	 * @return 1 si encontro el animal, 0 caso contrario
	 * @throws Exception
	 */
	String existeAnimal(String caravana) throws Exception;

	/**
	 * Metodo que determina si un animal existe en base a su caravana y tio
	 * 
	 * @param datosConsulta
	 *            Mapa con datos para la consulta
	 * @return 1 si encontro animal, 0 caso contrario
	 * @throws Exception
	 */
	public String existeAnimalByCaravanaAndTipo(
			Map<String, String> datosConsulta) throws Exception;

	/**
	 * Metodo que obtiene los datos de un animal para su modificacion
	 * 
	 * @param caravana
	 *            Caravana del animal
	 * @return Mapa con datos del animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalParaModificacionByCaravana(String caravana)
			throws Exception;

	/**
	 * Metodo que obtiene los datos de un animal para su modificacion
	 * 
	 * @param ID
	 *            ID del animal
	 * @return Mapa con datos del animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalParaModificacionById(String id)
			throws Exception;

	/**
	 * Metodo que obtiene listado de animales segun el corral
	 * 
	 * @param idCorral
	 *            Id de un corral
	 * @return Listado de mapas con datos de animales
	 * @throws Exception
	 */
	List<Map<String, String>> getAnimalesParaModificacionByCorral(
			String idCorral) throws Exception;

	/**
	 * Metodo que persiste el egreso de animales ya sea por venta o por muerte
	 * 
	 * @param datosEgreso
	 *            Datos del egreso
	 * @throws Exception
	 */
	void updateAnimalEgresoByCaravana(Map<String, Object> datosEgreso)
			throws Exception;

	/**
	 * Metodo que persiste el egreso de animales ya sea por venta o por muerte
	 * 
	 * @param datosEgreso
	 *            Datos del egreso
	 * @throws Exception
	 */
	void updateAnimalEgresoById(Map<String, Object> datosEgreso)
			throws Exception;

	/**
	 * Metodo que obtiene la cantidad de animales que hay en un corral y que son
	 * de un determinado tipo
	 * 
	 * @return datosConsulta Mapa con los datos para la consulta
	 * @throws Exception
	 */
	String cantidadAnimalesByTipoyCorral(Map<String, String> datosConsulta)
			throws Exception;

	/**
	 * Metodo que obtiene la cantidad de animales de un tipo que no estan en
	 * ningun corral
	 * 
	 * @return Tipo de animal
	 * @throws Exception
	 */
	String getAnimalesByTipoSinCorral(String tipo) throws Exception;

	/**
	 * Obtiene lista de animales que se encuentran en un corral
	 * 
	 * @param idCorral
	 *            Id corral
	 * @return lista de caravanas
	 * @throws Exception
	 */
	List<String> getAnimalByCorralConCaravana(String idCorral) throws Exception;

	/**
	 * Metodo que obtiene datos de un animal para la funcionalidad de movimiento
	 * de corrales.
	 * 
	 * @param caravana
	 *            Caravana de un animal
	 * @return Mapa con datos de un animal
	 * @throws Exception
	 */
	Map<String, String> getAnimalParaMovimientoByCaravana(String caravana)
			throws Exception;

	/**
	 * Metodo que obtiene todos los id de animales que cumplen con una
	 * determinada consulta
	 * 
	 * @param datosConsulta
	 *            Datos para la consulta
	 * @return Lista de id de animales
	 * @throws Exception
	 */
	List<Long> getIdsAnimales(Map<String, String> datosConsulta)
			throws Exception;

	/**
	 * Permite la modificacion de un animal a partir de su caravana permitiendo
	 * cambiarle el tipo, la caravana y la observacion
	 * 
	 * @param caravana
	 *            Caravana actual del animal
	 * @param caravanaNueva
	 *            Caravana nueva del animal
	 * @param tipoAnimal
	 *            Tipo de animal
	 * @param observacion
	 *            Observacion del animal
	 * 
	 * @throws Exception
	 */
	void updateAnimalByCarana(String caravana, String caravanaNueva,
			String tipoAnimal, String observacion) throws Exception;

	/**
	 * Permite la modificacion de un animal a partir del corral y su tipo de
	 * animal, permitiendo cambiarle el tipo, la caravana y la observacion
	 * 
	 * @param corral
	 *            Corral actual del animal
	 * @param tipoAnimalOriginal
	 *            Tipo de animal actual
	 * @param caravana
	 *            Caravana nueva para asociarle al animal
	 * @param tipoAnimalNuevo
	 *            Tipo de animal nuevo
	 * @param observacion
	 *            Observacion nueva
	 * 
	 * @throws Exception
	 */
	void updateAnimalByCorralyTipo(String idAnimal, String caravana,
			String tipoAnimalNuevo, String observacion) throws Exception;

	/**
	 * Metodo que valida que un proveedor no posea movimientos asociados
	 * 
	 * @param nombreProveedor
	 *            Nombre proveedor
	 * @return cantidad de movimientos
	 * @throws Exception
	 */
	Long validarMovimientosProveedor(String nombreProveedor) throws Exception;

	/**
	 * Metodo que obtiene todos los datos para la consulta de animales
	 * 
	 * @param datosConsulta
	 *            Mapa con los datos para la consulta
	 * @return
	 * @throws Exception
	 */
	List<Map<String, String>> getDatosReporteAnimal(
			Map<String, Object> datosConsulta) throws Exception;

	/**
	 * Metodo que valida que la fecha de ingreso de animales sea menos a la
	 * fecha pasada como parametro
	 * 
	 * @param idAnimal
	 * @return
	 * @throws Exception
	 */
	Date validarFechaIngresoAnimal(String idAnimal, Date fechaDesde)
			throws Exception;

	/**
	 * Metodo que obtiene todas las caravanas de animales de un proveedor en
	 * particular.
	 * 
	 * @param nombreProveedor
	 *            Nombre del proveedor
	 * @return
	 * @throws Exception
	 */
	List<String> getCaravanaByProveedor(String idProveedor) throws Exception;

	/**
	 * Metodo que obtiene todas las caravanas de animales de un cliente en
	 * particular.
	 * 
	 * @param nombreCliente
	 *            Nombre del Cliente
	 * @return
	 * @throws Exception
	 */
	List<String> getCaravanaByCliente(String idCliente) throws Exception;

	/**
	 * Obtiene los datos para poder validar un animal en el reporte de
	 * proveedores.
	 * 
	 * @param caravana
	 *            Caravana del animal
	 * @return
	 * @throws Exception
	 */
	Map<String, String> getDatosValidacion(String caravana) throws Exception;

	/**
	 * Obtiene el nombre de un proveedor en base a la caravana de un animal
	 * 
	 * @param caravana
	 * @return
	 * @throws Exception
	 */
	String getClienteByCaravana(String caravana) throws Exception;

	/**
	 * Metodo que realiza la insercion de una recria
	 * 
	 * @param datos
	 *            Mapa con los datos a insertar
	 * 
	 * @throws Exception
	 */
	public void insertRecria(Map<String, Object> datos) throws Exception;

	/**
	 * Metodo que obtiene todos los datos para la consulta de recria
	 * 
	 * @param datosConsulta
	 *            Mapa con los datos para la consulta
	 * @return
	 * @throws Exception
	 */
	List<Map<String, String>> getDatosReporteRecria(
			Map<String, Object> datosConsulta) throws Exception;

	/**
	 * Controla que una caravana madre no tenga en existencia una cria esecifica
	 * 
	 * @param caravanaMadre
	 * @param caravanaHija
	 * @return Cantidad de relaciones
	 * 
	 * @throws Exception
	 */
	String existeRelacionCriaMadre(String caravanaMadre, String caravanaHija)
			throws Exception;

	/**
	 * Actualiza recria
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void updateRecria(Map<String, Object> datosConsulta) throws Exception;

	/**
	 * Actualiza recria completamente todos los campos
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void updateRecriaCompleto(Map<String, Object> datosConsulta)
			throws Exception;

	/**
	 * Actualiza el campo de pso de ingreso tysa
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void updateAnimalPesoTysaIngreso(Map<String, Object> datosConsulta)
			throws Exception;

	/**
	 * Actualiza el campo de rodeo de cria de un animal.
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void updateAnimalRodeoCria(Map<String, Object> datosConsulta)
			throws Exception;

	/**
	 * Guarda el diagnostico de un animal.
	 * 
	 * @param datosConsulta
	 * @throws Exception
	 */
	void saveDiagnostico(Map<String, Object> datosConsulta) throws Exception;

	/**
	 * Obtiene el rodeo de cria de un animal
	 * 
	 * @param caravana
	 * @return
	 * @throws Exception
	 */
	String getRodeoCria(String caravana) throws Exception;

	/**
	 * Obtiene la cantidad de un tipo de diagnostico que hay actualmente
	 * 
	 * @param tipoDiagnostico
	 * @return
	 * @throws Exception
	 */
	String getCantidadDiagnosticos(String tipoDiagnostico) throws Exception;

	/**
	 * Obtiene los diagnosticos de un animal.
	 * 
	 * @param idAnimal
	 * @return
	 * @throws Exception
	 */
	List<Map<String, String>> getDiagnosticos(String idAnimal) throws Exception;

}
